-- 获取限流的 Redis key
local key = KEYS[1]

-- 获取注解上标注的限流次数（窗口内允许的请求数）
local limit = tonumber(ARGV[1])

-- 获取当前时间戳（毫秒）
local now = tonumber(ARGV[2])

-- 获取滑动窗口的大小（毫秒）
local windowSize = tonumber(ARGV[3])

-- 移除窗口外的请求记录（时间戳小于当前时间减去窗口大小）
redis.call('ZREMRANGEBYSCORE', key, '-inf', now - windowSize)

-- 获取当前窗口内的请求数量
local currentCount = redis.call('ZCARD', key)

-- 如果当前窗口内请求数量小于限制，则记录当前请求并返回当前数量加 1
if currentCount < limit then
    redis.call('ZADD', key, now, now)
    redis.call('EXPIRE', key, windowSize)
    return currentCount + 1
else
    -- 否则返回 0 表示请求被拒绝
    return 0
end
